package com.mezz.bones.framework.core.strategy;

import com.mezz.bones.framework.base.exception.BaseException;
import com.mezz.bones.framework.base.util.ClassUtil;

import java.util.Set;

/**
 * 所有策略接口都要继承此 根
 * 具体的策略对象定义自己的标识符
 * 项目初始化时加载所有的策略对象 存储至map对象中 key-tag信息 value为相对应的具体策略对象
 */
public interface IStrategy {

    /**
     * 策略对象标识符
     */
    String tag();


    /**
     * 1.类字节码+自定义业务标识符 = 策略对象唯一标识符 防止 出现相同的tag标识符策略对象
     * 2.this在这边就是 具体的策略对象
     * 使用具体的业务策略接口作为 策略符前缀符  因为获取策略实现类的时候 入参也是 业务策略接口
     */
    default String uniqueTag() {

        Set<Class<?>> interfaces = ClassUtil.getAllInterfaces(this.getClass());

        //层级递归 防止策略业务类中间使用了 抽象类等多层级结构
        for (Class<?> anInterface : interfaces) {
            if (IStrategy.class.isAssignableFrom(anInterface)) {
                return anInterface.getName() + "-" + tag().toString();
            }
        }
        throw new BaseException("未找到策略接口");
    }
}
